﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EveMarketsDAO.Fonction
{
	public class FonctionMarkets
	{
		/// <summary>
		/// Affiche le nombre de ligne présente dans la table TempMarkets.
		/// </summary>
		/// <returns></returns>
		public string NombreLigneTempMarket()
		{
			return (from dd in ContexteDAO.ContexteDonnees.TempMarkets
					select dd.orderid).Count().ToString("N");
		}

		#region SellOrders

		/// <summary>
		/// Affiche les SellOrders de la région pour un item
		/// </summary>
		/// <param name="idRegion"></param>
		/// <param name="idItem"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsRegion(int idRegion, int idItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.regionid == idRegion
						  && dd.typeid == idItem
						  && dd.bid == 0
					orderby dd.price
					select dd);
		}

		/// <summary>
		/// Affiche les SellOrders du système pour un item
		/// </summary>
		/// <param name="idSysteme"></param>
		/// <param name="idItem"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AfficherMarketsSystemes(int idSysteme, int idItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.systemid == idSysteme
						  && dd.typeid == idItem
						  && dd.bid == 0
					orderby dd.price
					select dd);
		}

		/// <summary>
		/// Affiche les prix de la station pour un item
		/// </summary>
		/// <param name="idStation"></param>
		/// <param name="idItem"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsStations(int idStation, int idItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.stationid == idStation
						  && dd.typeid == idItem
						  && dd.bid == 0
					orderby dd.price
					select dd);
		}

		/// <summary>
		/// Affiche les SellOrders de la région pour tout les items
		/// </summary>
		/// <param name="idRegion"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsRegion(int idRegion)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.regionid == idRegion
						  && dd.bid == 0
					orderby dd.price
					select dd);
		}

		/// <summary>
		/// Affiche les SellOrders du système pour tout les items
		/// </summary>
		/// <param name="idSysteme"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AfficherMarketsSystemes(int idSysteme)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.systemid == idSysteme
						  && dd.bid == 0
					orderby dd.price
					select dd);
		}

		/// <summary>
		/// Affiche les prix de la station pour tout les items
		/// </summary>
		/// <param name="idStation"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsStations(int idStation)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.stationid == idStation
						  && dd.bid == 0
					orderby dd.price
					select dd);
		}

		#endregion


		#region Buy Orders

		/// <summary>
		/// Affiche les BuyOrders de la région pour un item donnée
		/// </summary>
		/// <param name="idRegion"></param>
		/// <param name="idItem"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsRegionBuyOrders(int idRegion, int idItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.regionid == idRegion
						  && dd.typeid == idItem
						  && dd.bid == 1
					orderby dd.price descending
					select dd);
		}

		/// <summary>
		/// Affiche les BuyOrders de la région pour tout les items
		/// </summary>
		/// <param name="idRegion"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsRegionBuyOrders(int idRegion)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.regionid == idRegion
						  && dd.bid == 1
					orderby dd.price descending
					select dd);
		}

		/// <summary>
		/// Affiche les BuyOrders pour un système et pour un item donnée
		/// </summary>
		/// <param name="idSysteme"></param>
		/// <param name="idItem"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AfficherMarketsSystemesBuyOrders(int idSysteme, int idItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.systemid == idSysteme
						  && dd.typeid == idItem
						  && dd.bid == 1
					orderby dd.price descending
					select dd);
		}

		/// <summary>
		/// Affiche les BuyOrders pour un système et pour tout les items
		/// </summary>
		/// <param name="idSysteme"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AfficherMarketsSystemesBuyOrders(int idSysteme)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.systemid == idSysteme
						  && dd.bid == 1
					orderby dd.price descending
					select dd);
		}

		/// <summary>
		/// Affiche les BuyOrders pour une station et pour un item donnée
		/// </summary>
		/// <param name="idStation"></param>
		/// <param name="idItem"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsStationsBuyOrders(int idStation, int idItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.stationid == idStation
						  && dd.typeid == idItem
						  && dd.bid == 1
					orderby dd.price descending
					select dd);
		}

		/// <summary>
		/// Affiche les BuyOrders pour une station et pour tout les items
		/// </summary>
		/// <param name="idStation"></param>
		/// <returns></returns>
		public IQueryable<MarketsCentral> AffichageMarketsStationsBuyOrders(int idStation)
		{
			return (from dd in ContexteDAO.ContexteDonnees.MarketsCentral
					where dd.stationid == idStation
						  && dd.bid == 1
					orderby dd.price descending
					select dd);
		} 
		#endregion

		/// <summary>
		/// Récupère les informations du Markets pour un Item et une station donnée.
		/// </summary>
		/// <param name="numItem"></param>
		/// <param name="stationId"></param>
		/// <returns></returns>
		public Tuple<decimal, decimal, decimal, long> GetMarketByItem(int numItem, int stationId)
		{
			var toutesInfos =
				ContexteDAO.ContexteDonnees.MarketsCentral.Where(y => y.typeid.Equals(numItem) && y.stationid.Equals(stationId));

			// S'il n'y a pas de vente en cours, je retourne 0 pour toutes les valeurs.
			if(!toutesInfos.Any())
				return new Tuple<decimal, decimal, decimal, long>(0, 0, 0, 0); 

			decimal prixMin = toutesInfos.Min(y => y.price);
			decimal prixMax = toutesInfos.Max(y => y.price);
			decimal prixMoy = toutesInfos.Average(y => y.price);
			long stock = toutesInfos.Sum(y => y.volremain);

			return new Tuple<decimal, decimal, decimal, long>(prixMin,prixMoy, prixMax, stock);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="_idItemSelection"></param>
		/// <param name="_idStationVenteSelection"></param>
		/// <returns></returns>
		public IEnumerable GetMarketByItemByStation(int _idItemSelection, int _idStationVenteSelection)
		{
			return (ContexteDAO.ContexteDonnees.MarketsCentral.Where(x => x.typeid.Equals(_idItemSelection) 
																&& x.stationid.Equals(_idStationVenteSelection)));
		}
	}
}
